home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 071-080 / amok78 / sgconfiguration / sgconfigtest.mod < prev    next >
Text File  |  1993-11-04  |  11KB  |  362 lines

  1. (*************************************************************************
  2.  
  3. :Program.    SGConfigTest.mod
  4. :Contents.   test programm for SGConfiguraion
  5. :Author.     Hartmut Goebel [hG]
  6. :Copyright.  Public Domain
  7. :Language.   Oberon
  8. :Translator. Amiga Oberon V2.25
  9. :History.    V1.0, 23 Apr 1992 [hG]
  10. :Support.    Olaf `Olsen' Barthel: fragment from `term' source
  11. :Date.       07 May 1992 19:19:48
  12.  
  13. *************************************************************************)
  14.  
  15. MODULE SGConfigTest;
  16.  
  17. IMPORT
  18.   d  := Dos,
  19.   e  := Exec,
  20.   iff:= IFFParse,
  21.   ol := OberonLib,
  22.   req:= Requests,
  23.   s  := SYSTEM,
  24.   sgc:= SGConfiguration,
  25.   str:= Strings;
  26.  
  27. CONST
  28.   NumConfigChunks = 4;
  29.   Version = 200; Revision = 42;
  30.  
  31. TYPE
  32.   ChunkStops = ARRAY 2 * NumConfigChunks OF LONGINT;
  33.  
  34. CONST
  35.   TEST = s.VAL(LONGINT,"TEST"); (* global FORM-Type *)
  36.   VERS = s.VAL(LONGINT,"VERS"); (* VersionInfo Follows *)
  37.   CNFG = s.VAL(LONGINT,"CNFG"); (* NewConfig follows *)
  38.   PORT = s.VAL(LONGINT,"PORT"); (* name of ARexx-Port *)
  39.   SCRN = s.VAL(LONGINT,"SCRN"); (* screen name *)
  40.   STRT = s.VAL(LONGINT,"STRT"); (* name of source file *)
  41.  
  42.   StopAt = ChunkStops(  (* That ar all the chunks we wanna read *)
  43.     TEST, CNFG,
  44.     TEST, PORT,
  45.     TEST, SCRN,
  46.     TEST, STRT);
  47.  
  48. TYPE
  49.   Configuration * = STRUCT
  50.     left*, top*, width*, height*: INTEGER;
  51.     screenDepth*: INTEGER;
  52.     aslLeft*, aslTop*, aslWidth*, aslHeight*: INTEGER;
  53.   END;
  54.  
  55.   VersionInfoPtr = POINTER TO VersionInfo;
  56.   VersionInfo = STRUCT
  57.     ver, rev: INTEGER;
  58.   END;
  59.  
  60. CONST
  61.   ThisVersion = VersionInfo(Version,Revision);
  62.  
  63.   StdConfig * = Configuration(
  64.     0,0,640,200,   (* window edges *)
  65.     0,             (* screendepth *)
  66.     20,20,100,200); (* asl edges *)
  67.  
  68.   SGCTest = "SGCTest";
  69.  
  70.   Template = "SETTING/K,USE/S,SAVE/S,WRITE/S,TRY/K,CD=CDFIRST/S";
  71.  
  72.   numberOfArguments = 6;
  73.  
  74.   argSetting = 0;
  75.   argUse = 1;
  76.   argSave = 2;
  77.   argWrite = 3;
  78.   argTry = 4;
  79.   argCDFirst = 5;
  80.  
  81. TYPE
  82.   argvType = ARRAY numberOfArguments OF (*e.ADDRESS*)LONGINT;
  83.  
  84. CONST
  85.   DefaultArguments = argvType(s.ADR(""),0,0,0,s.ADR(""),0);
  86.  
  87. VAR
  88.   Argv: argvType;
  89.   Arguments: d.RDArgsPtr;
  90.   DirLock: d.FileLockPtr;
  91.   DirBuffer, SettingsName : e.STRING;
  92.   string, string2: e.STRPTR;
  93.  
  94.   PortName *: e.STRPTR;
  95.   ScreenName *: e.STRPTR;
  96.   StartUpName *: e.STRPTR;  (* for ARexx-Scripts *)
  97.   Config *: Configuration;
  98.  
  99.  
  100. PROCEDURE WriteConfig * (Name: ARRAY OF CHAR): BOOLEAN; (* $CopyArrays- *)
  101. VAR
  102.   handle: iff.IFFHandlePtr;
  103.   success: BOOLEAN;
  104.   len: LONGINT;
  105. BEGIN
  106.   success := FALSE;
  107.  
  108.   handle := iff.AllocIFF();
  109.   IF handle # NIL THEN
  110.  
  111.     handle.stream := s.VAL(s.ADDRESS,d.Open(Name,d.newFile));
  112.     IF handle.stream # NIL THEN
  113.  
  114.       iff.InitIFFasDOS(handle);
  115.       IF iff.OpenIFF(handle,iff.write) = 0 THEN
  116.  
  117.         (* Push outmost chunk onto stack *)
  118.         IF iff.PushChunk(handle,TEST,iff.idFORM,iff.IFFSizeUnknown) = 0 THEN
  119.  
  120.           (* Add a version identifier *)
  121.           IF iff.PushChunk(handle,0,VERS,iff.IFFSizeUnknown) = 0 THEN
  122.             IF (iff.WriteChunkBytes(handle,ThisVersion,SIZE(ThisVersion)) = SIZE(ThisVersion))
  123.             & (iff.PopChunk(handle) = 0) THEN
  124.              success := TRUE;
  125.             END;
  126.           END;
  127.  
  128.           (* Push the config chunk on the stack *)
  129.           IF success & (iff.PushChunk(handle,0,CNFG,iff.IFFSizeUnknown) = 0) THEN
  130.             IF (iff.WriteChunkBytes(handle,Config,SIZE(Config)) = SIZE(Config))
  131.             & (iff.PopChunk(handle) = 0) THEN
  132.               success := TRUE;
  133.             END;
  134.           END;
  135.  
  136.           (* Now all the other chunks we wonna write *)
  137.           IF success & (PortName # NIL) THEN
  138.             IF (iff.PushChunk(handle,0,PORT,iff.IFFSizeUnknown) = 0) THEN
  139.               len := str.Length(PortName^);
  140.               IF (iff.WriteChunkBytes(handle,PortName^,len) # len)
  141.               OR (iff.PopChunk(handle) # 0) THEN
  142.                 success := FALSE;
  143.               END;
  144.             END;
  145.           END;
  146.  
  147.           IF success & (ScreenName # NIL) THEN
  148.             IF (iff.PushChunk(handle,0,SCRN,iff.IFFSizeUnknown) = 0) THEN
  149.               len := str.Length(ScreenName^);
  150.               IF (iff.WriteChunkBytes(handle,ScreenName^,len) # len)
  151.               OR (iff.PopChunk(handle) # 0) THEN
  152.                 success := FALSE;
  153.               END;
  154.             END;
  155.           END;
  156.  
  157.           IF success & (StartUpName # NIL) THEN
  158.             IF (iff.PushChunk(handle,0,STRT,iff.IFFSizeUnknown) = 0) THEN
  159.               len := str.Length(StartUpName^);
  160.               IF (iff.WriteChunkBytes(handle,StartUpName^,len) # len)
  161.               OR (iff.PopChunk(handle) # 0) THEN
  162.                 success := FALSE;
  163.               END;
  164.             END;
  165.           END;
  166.  
  167.           (* Seems that we're done, now try to pop the FORM chunk
  168.            * and return.
  169.            *)
  170.           IF iff.PopChunk(handle) # 0 THEN
  171.             success := FALSE;
  172.           END;
  173.         END;
  174.  
  175.         iff.CloseIFF(handle); (* Close the handle (flush any pending data). *)
  176.       END;
  177.  
  178.       (* Close the DOS handle itself. *)
  179.       IF ~d.Close(s.VAL(d.FileHandlePtr,handle.stream)) THEN
  180.         success := FALSE;
  181.       END;
  182.     END;
  183.  
  184.     iff.FreeIFF(handle); (* And free the IFF handle. *)
  185.   END;
  186.  
  187.   IF success & d.SetProtection(Name,LONGSET{d.execute}) THEN END;
  188.   RETURN success;
  189. END WriteConfig;
  190.  
  191.  
  192. PROCEDURE ReadConfig * (file: d.FileHandlePtr): BOOLEAN;
  193. VAR
  194.   handle: iff.IFFHandlePtr;
  195.   success: BOOLEAN;
  196.   size, err: LONGINT;
  197.   prop: iff.StoredPropertyPtr;
  198.   chunk: iff.ContextNodePtr;
  199.   verInfo: VersionInfoPtr;
  200.  
  201.   PROCEDURE ReadIFFString (VAR to: e.STRPTR);
  202.   VAR
  203.     string: e.STRING;
  204.   BEGIN
  205.     success := FALSE;
  206.  
  207.     (* Read only as much char as in the chunk *)
  208.     IF chunk.size < SIZE(e.STRING) THEN
  209.       size := chunk.size;
  210.     ELSE
  211.       size := SIZE(e.STRING);
  212.     END;
  213.  
  214.      (* The file read pointer is positioned just in front of the first data
  215.       * to be read, so let's don't disappoint iffparse and read it.
  216.       *)
  217.     IF iff.ReadChunkBytes(handle,string,size) = size THEN
  218.       ol.New(to,size+1);
  219.       IF to # NIL THEN
  220.         e.CopyMem(string,to^,size);
  221.         success := TRUE;
  222.       END;
  223.     END;
  224.   END ReadIFFString;
  225.  
  226. BEGIN
  227.   success := FALSE;
  228.  
  229.   handle := iff.AllocIFF();
  230.   IF handle # NIL THEN
  231.  
  232.     handle.stream := s.VAL(s.ADDRESS,file);
  233.     IF handle.stream # NIL THEN
  234.       iff.InitIFFasDOS(handle);
  235.  
  236.       IF iff.OpenIFF(handle,iff.read) = 0 THEN
  237.  
  238.         (* Collect version number ID if available *)
  239.         IF iff.PropChunk(handle,TEST,VERS) = 0  THEN
  240.  
  241.           (* The following line tells iffparse to stop at the
  242.            * very beginning of one of the config chunks contained in a
  243.            * `TEST ' FORM chunk.
  244.            *)
  245.           IF iff.StopChunks(handle,StopAt,NumConfigChunks) = 0 THEN
  246.  
  247.             (* Parse the file... *)
  248.             LOOP
  249.               err := iff.ParseIFF(handle,iff.iffParseScan);
  250.               CASE err OF
  251.               |iff.IFFErrEOF: EXIT; (* finished *)
  252.               |iff.IFFErrEOC: (* No action *)
  253.               |0:
  254.                 chunk := iff.CurrentChunk(handle);
  255.                 IF (chunk # NIL) & (chunk.type = TEST) THEN
  256.                   CASE chunk.id OF
  257.                   |CNFG:
  258.                     prop := iff.FindProp(handle,TEST,VERS); (* Did we get a version ID? *)
  259.                     IF prop # NIL THEN
  260.                       (* Is it the file format we are able to read? *)
  261.                       verInfo := s.VAL(s.ADDRESS,prop.data);
  262.                       IF (verInfo.ver <= Version) & (verInfo.rev <= Revision) THEN
  263.                         IF chunk.size < SIZE(Config) THEN
  264.                           size := chunk.size;
  265.                         ELSE
  266.                           size := SIZE(Config);
  267.                         END;
  268.                         (* The file read pointer is positioned
  269.                          * just in front of the first data
  270.                          * to be read, so let's don't disappoint
  271.                          * iffparse and read it.
  272.                          *)
  273.                         IF iff.ReadChunkBytes(handle,Config,size) = size THEN
  274.                           success := TRUE; END;
  275.                       END;
  276.                     END;
  277.                   |PORT: ReadIFFString(PortName);
  278.                   |SCRN: ReadIFFString(ScreenName);
  279.                   |STRT: ReadIFFString(StartUpName);
  280.                   ELSE (* just ignore other Chunks *)
  281.                   END; (* CASE chunk.id *)
  282.                 END; (* IF chunk # NIL *)
  283.               ELSE
  284.                 success := FALSE; EXIT; (* error uccured *)
  285.               END; (* CASE err *)
  286.               IF ~success THEN EXIT; END
  287.             END; (* LOOP *)
  288.  
  289.           END; (* IF StopChunks *)
  290.         END; (* IF PropChunk *)
  291.  
  292.         iff.CloseIFF(handle);
  293.       END; (* IF OpenIFF *)
  294.  
  295.       (* ee MUST NOT close <file> *)
  296.  
  297.     END; (* IF handle.stream *)
  298.  
  299.     iff.FreeIFF(handle);
  300.   END;  (* IF AllocHandle *)
  301.  
  302.   RETURN success;
  303. END ReadConfig;
  304.  
  305. BEGIN
  306.   req.Assert(d.dos.lib.version>=36,"SGConfigTest needs AmigaOS 2.0 or higher!");
  307.  
  308.   sgc.BaseName := SGCTest;
  309.   Argv := DefaultArguments;
  310.   DirLock := NIL;
  311.   PortName := NIL; ScreenName := NIL; StartUpName := NIL;
  312.  
  313.   Arguments := d.ReadArgs(Template,Argv,NIL);
  314.   IF Arguments = NIL THEN
  315.     IF d.PrintFault(d.IoErr(),"SBConfigTest: ") THEN END;
  316.     HALT(20);
  317.   END;
  318.  
  319.   string := s.VAL(e.STRPTR,Argv[argSetting]);
  320.   string2 := s.VAL(e.STRPTR,Argv[argTry]);
  321.   SettingsName := string^;
  322.  
  323.   IF sgc.ReadConfig(SettingsName,DirLock,
  324.                     Argv[argCDFirst]=d.DOSTRUE,string2^,ReadConfig) THEN
  325.     IF d.NameFromLock(DirLock,DirBuffer,SIZE(DirBuffer)) THEN END;
  326.     d.PrintF("Configuration %s read from dir %s\n",
  327.               s.ADR(SettingsName), s.ADR(DirBuffer));
  328.     (*d.PrintF("  %s\n",PortName); d.PrintF("  %s\n",ScreenName); d.PrintF("  %s\n",StartUpName);*)
  329.   ELSE
  330.     IF d.PutStr("--> ReadError\n") = 0 THEN END;
  331.     SettingsName := string^; (* failed, use old text *)
  332.     PortName := s.ADR("ARexxPort");
  333.     ScreenName := s.ADR("MyScreen");
  334.     StartUpName := s.ADR("StartMeUp!!");
  335.   END;
  336.  
  337.   IF Argv[argWrite] # d.DOSFALSE THEN
  338.     IF sgc.WriteConfig(SettingsName,DirLock,WriteConfig) THEN
  339.       IF d.NameFromLock(DirLock,DirBuffer,SIZE(DirBuffer)) THEN END;
  340.       d.PrintF("Configuration %s written to dir %s\n",s.ADR(SettingsName), s.ADR(DirBuffer));
  341.     ELSE
  342.       IF d.PutStr("Configuration write failed\n") = 0 THEN END;
  343.     END;
  344.   ELSIF Argv[argSave] # d.DOSFALSE THEN
  345.     IF sgc.UseConfig(TRUE,WriteConfig) THEN
  346.       IF d.PutStr("Configuration saved successfully\n") = 0 THEN END;
  347.     ELSE
  348.       IF d.PutStr("Configuration save failed\n") = 0 THEN END;
  349.     END;
  350.   ELSIF Argv[argUse] # d.DOSFALSE THEN
  351.     IF sgc.UseConfig(FALSE,WriteConfig) THEN
  352.       IF d.PutStr("Configuration used successfully\n") = 0 THEN END;
  353.     ELSE
  354.       IF d.PutStr("Configuration save failed\n") = 0 THEN END;
  355.     END;
  356.   END;
  357.  
  358.   IF DirLock # NIL THEN d.UnLock(DirLock); END;
  359.   IF Arguments # NIL THEN d.FreeArgs(Arguments); END;
  360. END SGConfigTest.
  361.  
  362.